package com.tedu.API.list;

import org.junit.Test;

import javax.swing.*;
import java.util.ArrayList;
import java.util.Collection;

/**
 * 存放很多相同数据-----数据    989个数据
 * int[] i=new int[989];   要求:1.定长  2.类型固定
 * 需求: 存989个数据，而且数据不相同
 *   当我们的需求中存在数量不确定，类型也不确定----使用集合保存数据
 *
 * 集合:  存放相同【不相同】的数据的容器，使用功能与数组类似，保存一组数据
 *
 * Collection 【接口】 顶级集合   容器
 * 作用: 所有集合的顶级接口，规定所有集合都具备的方法!
 *
 * Collection【接口】可以创建对象---多态创建顶级集合
 * Collection   引用=new ArayList();   爷爷类=孙子类--继承关系--多态
 * List子接口【继承Collection接口】: 可以存重复元素，并且有序
 *     ArrayList实现类【继承List子接口】: 理解为"数组"
 *     LinkedList实现类【继承List子接口】
 * Set子接口【继承Collection接口】: 不可以存重复元素
 */
public class CollectionAPI {
    @Test
    public void testCollection(){
        //创建顶级集合【容器】
        Collection c=new ArrayList<>();

        /**
         * add(Object o)方法   返回值: boolean
         * 作用: 向当前集合添加元素，元素可以为任意，存入成功true，失败false
         */
        c.add("字符串");  c.add(1); c.add(123.12);
        c.add(new JFrame());    c.add(new Object());
        System.out.println("打印集合: "+c);

        /**
         * remove(Object o)方法  返回值: boolean
         * 作用: 删除集合中给定的元素，只会删除第一个元素
         * 需求: 删除c集合中  元素为1的内容
         * 底层: 采用equals方法进行对比，移除内容与集合内容相等，移除
         *      不相等，无操作!
         */
        c.remove(1);
        System.out.println("删除后集合: "+c);

        /**
         * size()方法
         * 作用: 获取到集合中的元素个数---数组存在length，获取数组长度
         */
        int size=c.size();
        System.out.println("集合元素个数: "+size);

        /**
         * clear方法   返回值: void
         * 作用: 清空集合元素
         * isEmpty()方法  返回值: boolean
         * 作用: 返回集合元素，如果有元素false,没元素显示true
         *
         */
        c.clear();  //清空集合
        //System.out.println(c);
        boolean b=c.isEmpty();
        //是不是空的，是空---没有元素显示true，反之
        System.out.println("集合中没有元素: "+b);
    }

    /**
     * 当前集合: addAll(Collection c【给定集合】)   操作: 并集
     * 作用: 将给定集合中的所有元素添加至当前集合中，添加成功true
     */
    @Test
    public void testAddAll(){
        Collection c1=new ArrayList();
        c1.add("java"); c1.add("net"); c1.add("go");
        Collection c2=new ArrayList();
        c2.add("c");  c2.add("java");  c2.add("php");
        boolean b= c1.addAll(c2);
        System.out.println("集合并集结果: "+c1);
        System.out.println("并集是否成功: "+b);  //true
    }

    /**
     * contains()方法    返回值: boolean
     * 作用: 判断当前集合是否包含给定元素，包含返回true
     * containsAll()方法   返回值: boolean
     * 作用: 判断当前集合是否包含给定集合中的所有元素
     *     当前集合.containsAll(给定集合)
     * 注意: 判断所有集合元素一致，返回:  true
     *      当前集合包含给定集合元素，元素存在，返回: true
     *      当前集合包含给定集合元素，元素不存在，返回: false
     *      总结: containsAll,个数不参考，存入顺序，元素数据是否一致
     */
    @Test
    public void testContains(){
        Collection c1=new ArrayList();
        c1.add("java"); c1.add("net"); c1.add("go");
        Collection c2=new ArrayList();
        c2.add("go");  c2.add("net");  c2.add("java");
        boolean b1=c1.containsAll(c2);
        System.out.println("c1是否包含c2: "+b1);  //true

        //判断集合中，是否存在java 元素【数据】
        boolean b=c1.contains("java");
        System.out.println("判断c1当中是否存在java元素: "+b);

    }

    /**
     * removeAll()方法   返回值: boolean   操作: 交集
     * 作用: 删除当前集合中与给定集合中的共有元素
     * 总结: 顺序不参考，只判断共有元素，存在即删除，保留当前集合，而不是给定集合
     */
    @Test
    public void testRemoveAll(){
        Collection c1=new ArrayList();
        c1.add("4"); c1.add("2"); c1.add("1");
        Collection c2=new ArrayList();
        c2.add("3"); c2.add("3"); c2.add("3");
        boolean b=c1.removeAll(c2);
        System.out.println("c1是否删除c2的元素: "+b);  //true
        System.out.println("c1交集的集合: "+c1);   //[4,2,1]
    }

}
